package com.atuguigu.boot3.core.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

import java.time.Duration;

@Slf4j
/**
 * springboot应用生命周期监听函数
 * ctrl+o 实现方法
 */
/**
Listener先要从META-INF/spring.factories读到
 1、引导：利⽤BootstrapContext 引导整个项⽬启动starting：应⽤开始，SpringApplication的run⽅法⼀调⽤，只要有了
 BootstrapContext就执⾏environmentPrepared：环境准备好（把启动参数等绑定到环境变量中），但是ioc还没有创建；【调⼀次】
2、启动：contextPrepared：ioc容器创建并准备好，但是sources（主配置类）没加载。并关闭引导上下⽂；组件都没创建【调⼀次】
contextLoaded：ioc容器加载。主配置类加载进去了。但是ioc容器还没刷新（我们的bean没创建）。
=======
截⽌以前，ioc容器⾥⾯还没造bean呢
=======
started： ioc容器刷新了（所有bean造好了），但是runner没调⽤。
ready:ioc容器刷新了（所有bean造好了），所有runner调⽤完了。
 3、运⾏
*/


public class MyAppListener implements SpringApplicationRunListener {
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
//        SpringApplicationRunListener.super.starting(bootstrapContext);
        log.error("starting 正在启动");
    }


    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
//        SpringApplicationRunListener.super.environmentPrepared(bootstrapContext, environment);
        log.info("environmentPrepared 环境准备完成");
    }


    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
//        SpringApplicationRunListener.super.contextPrepared(context);
        log.info("contextPrepared ioc容器准备完成");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
//        SpringApplicationRunListener.super.contextLoaded(context);
        log.info("contextLoaded ioc容器加载完成");
    }

    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
//        SpringApplicationRunListener.super.started(context, timeTaken);
        log.info("started 启动完成");
    }

    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
//        SpringApplicationRunListener.super.ready(context, timeTaken);
        log.info("ready 准备就绪");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
//        SpringApplicationRunListener.super.failed(context, exception);
        log.info("failed 应用启动失败");
    }
}
